home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Interface-Joysticks.st < prev    next >
Text File  |  1993-07-24  |  69KB  |  2,149 lines

  1. "    NAME        Interface-Joysticks
  2.     AUTHOR        tph@cs.man.ac.uk
  3.     FUNCTION mouse becomes a joystick; many eg's 
  4.     ST-VERSIONS    2.3
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    Interface-Joysticks
  11.     contains several MVC components to mimic
  12.    various joysticks, which can be moved by moving the mouse around.
  13.    It is intended as a small part for larger MVC applications
  14.    (especially games!!).  It is modelled closely on the
  15.    Switch/SwitchView stuff.
  16.  
  17.    This    goodie is only known to work with VI2.2 and VI2.3 images,
  18.    although it could probably be made to work with other versions
  19.    quite easily.
  20.  
  21.    The current version is dated 6/1/89, and has been quite extensively
  22.    reworked.  A large number of examples are provided.   -tph
  23. "!
  24. Controller subclass: #JoystickController
  25.     instanceVariableNames: 'offsize '
  26.     classVariableNames: 'DefaultOffSize '
  27.     poolDictionaries: ''
  28.     category: 'Interface-Joysticks'!
  29. JoystickController comment:
  30. 'I am a Controller subclass intended for use with a JoystickView and an
  31. instance of a subclass of Joystick.  I operate only on ''red button'' presses.
  32. I have just one instance variable:
  33.  
  34. offsize        <Number>, representing the ''dead'' area in the center of the Joystick.'!
  35.  
  36.  
  37. !JoystickController methodsFor: 'initialize-release'!
  38.  
  39. initialize
  40.     "Initialize instance variable."
  41.  
  42.     super initialize.
  43.     offsize _ DefaultOffSize! !
  44.  
  45. !JoystickController methodsFor: 'accessing'!
  46.  
  47. offSize
  48.     "Answer with the value of the current dead region."
  49.  
  50.     ^offsize!
  51.  
  52. offSize: aNumber
  53.     "Set the value of the current dead region."
  54.  
  55.     offsize _ aNumber! !
  56.  
  57. !JoystickController methodsFor: 'basic control sequence'!
  58.  
  59. controlInitialize
  60.     "When controller started, make the cursor a crosshair."
  61.  
  62.     Cursor crossHair show!
  63.  
  64. controlTerminate
  65.     "When control released, restore the cursor and display."
  66.  
  67.     Cursor normal show.
  68.     model clear! !
  69.  
  70. !JoystickController methodsFor: 'control defaults'!
  71.  
  72. controlActivity
  73.     "If the red button is pressed, move the joystick about."
  74.  
  75.     sensor keyboardPressed ifTrue: [
  76.         model moveCharacter: sensor keyboard].
  77.     sensor redButtonPressed ifTrue: [
  78.         self movementAction.
  79.         sensor waitNoButton.
  80.         model return]!
  81.  
  82. movementAction
  83.     "If the cursor is close to the center of the displayed view, then
  84.      center the model.  Otherwise, move the model."
  85.  
  86.     | center point |
  87.     center _ view insetDisplayBox center.
  88.     (center dist: sensor cursorPoint) < offsize
  89.         ifTrue: [model return]
  90.         ifFalse: [model movePoint: sensor cursorPoint - center]! !
  91. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  92.  
  93. JoystickController class
  94.     instanceVariableNames: ''!
  95.  
  96.  
  97. !JoystickController class methodsFor: 'class initialization'!
  98.  
  99. initialize
  100.     "Initialize class variables."
  101.     "JoystickController initialize."
  102.  
  103.     DefaultOffSize _ 10.        "Maximum distance from center
  104.                                  of view where no action takes place."! !
  105.  
  106. JoystickController initialize!
  107.  
  108.  
  109. View subclass: #JoystickView
  110.     instanceVariableNames: ''
  111.     classVariableNames: 'DiagonalOffForm DownForm DownLeftForm DownRightForm FourWayOffForm HorizOffForm LeftForm RightForm UpForm UpLeftForm UpRightForm VertOffForm '
  112.     poolDictionaries: ''
  113.     category: 'Interface-Joysticks'!
  114. JoystickView comment:
  115. 'I am a View subclass intended for use with various Joystick subclasses.  I
  116. know how to display various ''joystick-like'' forms.  The actual forms used
  117. are retained as class variables:
  118.  
  119. DiagonalOffForm
  120. DownForm
  121. DownLeftForm
  122. DownRightForm
  123. FourWayOffForm
  124. HorizOffForm
  125. LeftForm
  126. RightForm
  127. UpForm
  128. UpLeftForm
  129. UpRightForm
  130. VertOffForm
  131.  
  132. See the comment in JoystickView class|initialize to view these forms.
  133. '!
  134.  
  135.  
  136. !JoystickView methodsFor: 'initialize-release'!
  137.  
  138. initialize
  139.     "Ensure that the inside colour is white by default."
  140.  
  141.     super initialize.
  142.     self insideColor: Form white.! !
  143.  
  144. !JoystickView methodsFor: 'controller access'!
  145.  
  146. defaultControllerClass
  147.     "The default controller is JoystickController."
  148.  
  149.     ^JoystickController! !
  150.  
  151. !JoystickView methodsFor: 'displaying'!
  152.  
  153. displayDown
  154.     "Display the down form."
  155.  
  156.     DownForm displayAt:
  157.         self insetDisplayBox center - DownForm boundingBox center!
  158.  
  159. displayLeft
  160.     "Display the left form."
  161.  
  162.     LeftForm displayAt:
  163.         self insetDisplayBox center - LeftForm boundingBox center!
  164.  
  165. displayLeftDown
  166.     "Display the left-and-down form."
  167.  
  168.     DownLeftForm displayAt:
  169.         self insetDisplayBox center - DownLeftForm boundingBox center!
  170.  
  171. displayLeftUp
  172.     "Display the left-and-up form."
  173.  
  174.     UpLeftForm displayAt:
  175.         self insetDisplayBox center - UpLeftForm boundingBox center!
  176.  
  177. displayOff
  178.     "Display the off form."
  179.  
  180.     model class == TwoWayHorizJoystick ifTrue: [
  181.         HorizOffForm displayAt:
  182.             self insetDisplayBox center - HorizOffForm boundingBox center.
  183.         ^self].
  184.     model class == TwoWayVertJoystick ifTrue: [
  185.         VertOffForm displayAt:
  186.             self insetDisplayBox center - VertOffForm boundingBox center.
  187.         ^self].
  188.     model class == DiagonalJoystick ifTrue: [
  189.         DiagonalOffForm displayAt:
  190.             self insetDisplayBox center - DiagonalOffForm boundingBox center.
  191.         ^self].
  192.     FourWayOffForm displayAt:
  193.             self insetDisplayBox center - FourWayOffForm boundingBox center.!
  194.  
  195. displayRight
  196.     "Display the right form."
  197.  
  198.     RightForm displayAt:
  199.         self insetDisplayBox center - RightForm boundingBox center!
  200.  
  201. displayRightDown
  202.     "Display the right-and-down form."
  203.  
  204.     DownRightForm displayAt:
  205.         self insetDisplayBox center - DownRightForm boundingBox center!
  206.  
  207. displayRightUp
  208.     "Display the right-and-up form."
  209.  
  210.     UpRightForm displayAt:
  211.         self insetDisplayBox center - UpRightForm boundingBox center!
  212.  
  213. displayUp
  214.     "Display the up form."
  215.  
  216.     UpForm displayAt:
  217.         self insetDisplayBox center - UpForm boundingBox center!
  218.  
  219. displayView
  220.     "Display the appropriate form for the receiver's model."
  221.  
  222.     model state == #off ifTrue: [self displayOff].
  223.     model state == #up ifTrue: [self displayUp].
  224.     model state == #down ifTrue: [self displayDown].
  225.     model state == #left ifTrue: [self displayLeft].
  226.     model state == #right ifTrue: [self displayRight].
  227.     model state == #leftUp ifTrue: [self displayLeftUp].
  228.     model state == #leftDown ifTrue: [self displayLeftDown].
  229.     model state == #rightUp ifTrue: [self displayRightUp].
  230.     model state == #rightDown ifTrue: [self displayRightDown].! !
  231.  
  232. !JoystickView methodsFor: 'updating'!
  233.  
  234. update: aParameter
  235.     "Ignore aParameter, and redisplay the receiver."
  236.  
  237.     aParameter == #error ifTrue: [self flash] ifFalse: [self display]! !
  238. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  239.  
  240. JoystickView class
  241.     instanceVariableNames: ''!
  242.  
  243.  
  244. !JoystickView class methodsFor: 'class initialization'!
  245.  
  246. initialize
  247.     "Initialize all the forms used for displaying."
  248.     "JoystickView initialize."
  249.  
  250.     self initializeOffForms.
  251.     self initializeUpForm.
  252.     self initializeUpRightForm.
  253.     self initializeOtherForms
  254.  
  255.     "(Quadrangle new region: (30@80 extent: 440@140))
  256.         borderWidth: 2;
  257.         insideColor: Form gray;
  258.         display.
  259.      JoystickView fourWayOffForm displayAt: 50@100.
  260.      JoystickView diagonalOffForm displayAt: 100@100.
  261.      JoystickView horizOffForm displayAt: 150@100.
  262.      JoystickView vertOffForm displayAt: 200@100.
  263.      JoystickView upForm displayAt: 250@100.
  264.      JoystickView rightForm displayAt: 300@100.
  265.      JoystickView downForm displayAt: 350@100.
  266.      JoystickView leftForm displayAt: 400@100.
  267.      JoystickView upRightForm displayAt: 250@150.
  268.      JoystickView downRightForm displayAt: 300@150.
  269.      JoystickView upLeftForm displayAt: 350@150.
  270.      JoystickView downLeftForm displayAt: 400@150."! !
  271.  
  272. !JoystickView class methodsFor: 'class access'!
  273.  
  274. diagonalOffForm
  275.     "Answer with the form displayed for no movement, for diagonal
  276.      (four-way) models."
  277.  
  278.     ^DiagonalOffForm!
  279.  
  280. downForm
  281.     "Answer with the form displayed for downwards movement."
  282.  
  283.     ^DownForm!
  284.  
  285. downLeftForm
  286.     "Answer with the form displayed for down-and-left movement."
  287.  
  288.     ^DownLeftForm!
  289.  
  290. downRightForm
  291.     "Answer with the form displayed for down-and-right movement."
  292.  
  293.     ^DownRightForm!
  294.  
  295. fourWayOffForm
  296.     "Answer with the form displayed for no movement, for four-way models."
  297.  
  298.     ^FourWayOffForm!
  299.  
  300. horizOffForm
  301.     "Answer with the form displayed for no movement, for horizontal 2-way models."
  302.  
  303.     ^HorizOffForm!
  304.  
  305. leftForm
  306.     "Answer with the form displayed for leftwards movement."
  307.  
  308.     ^LeftForm!
  309.  
  310. rightForm
  311.     "Answer with the form displayed for rightwards movement."
  312.  
  313.     ^RightForm!
  314.  
  315. upForm
  316.     "Answer with the form displayed for upwards movement."
  317.  
  318.     ^UpForm!
  319.  
  320. upLeftForm
  321.     "Answer with the form displayed for up-and-left movement."
  322.  
  323.     ^UpLeftForm!
  324.  
  325. upRightForm
  326.     "Answer with the form displayed for up-and-right movement."
  327.  
  328.     ^UpRightForm!
  329.  
  330. vertOffForm
  331.     "Answer with the form displayed for no movement, for vertical 2-way models."
  332.  
  333.     ^VertOffForm! !
  334.  
  335. !JoystickView class methodsFor: 'private'!
  336.  
  337. initializeDiagonalOffForm
  338.     "Initialize the default form used to display in the off position,
  339.      for 4-way (diagonal) joysticks."
  340.  
  341.     DiagonalOffForm _ OpaqueForm figure: (Form
  342.     extent: 50@50
  343.     fromArray: # (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 384 0 96 0 320 0 160 0 288 0 288 0 272 0 544 0 264 0 1056 0 260 192 2080 0 258 1848 4128 0 257 6150 8224 0 256 40961 16416 0 256 16384 32800 0 256 48959 16416 0 257 15903 8224 0 257 15903 8224 0 258 16191 4128 0 258 16383 4128 0 258 10233 4128 0 260 1008 2080 0 260 1008 2080 0 258 10233 4128 0 258 16383 4128 0 258 16319 4128 0 257 15903 8224 0 257 15903 8224 0 256 48959 16416 0 256 16384 32800 0 256 40961 16416 0 257 6150 8224 0 258 1848 4128 0 260 192 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  344.     offset: 0@0) shape: (Form
  345.     extent: 50@50
  346.     fromArray: # (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  347.     offset: 0@0)!
  348.  
  349. initializeFourWayOffForm
  350.     "Initialize the default form used to display in the off position,
  351.      for 4-way joysticks."
  352.  
  353.     FourWayOffForm _ OpaqueForm figure: (Form
  354.     extent: 50@50
  355.     fromArray: #(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 384 0 96 0 320 0 160 0 288 0 288 0 272 0 544 0 264 0 1056 0 260 192 2080 0 258 1848 4128 0 257 6150 8224 0 256 41153 16416 0 256 16864 32800 0 256 33776 16416 0 257 2040 8224 0 257 480 8224 0 258 4578 4128 0 258 12771 4128 0 258 32767 36896 0 260 65535 51232 0 260 65535 51232 0 258 29155 36896 0 258 12771 4128 0 258 4578 4128 0 257 480 8224 0 257 2040 8224 0 256 33776 16416 0 256 16864 32800 0 256 41153 16416 0 257 6150 8224 0 258 1848 4128 0 260 192 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  356.     offset: 0@0) shape: (Form
  357.     extent: 50@50
  358.     fromArray: #(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  359.     offset: 0@0)!
  360.  
  361. initializeHorizOffForm
  362.     "Initialize the default form used to display in the off position,
  363.      for 2-way horizontal joysticks."
  364.  
  365.     HorizOffForm _ OpaqueForm figure: (Form
  366.     extent: 50@50
  367.     fromArray: # (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 384 0 96 0 320 0 160 0 288 0 288 0 272 0 544 0 264 0 1056 0 260 192 2080 0 258 1848 4128 0 257 6150 8224 0 256 40961 16416 0 256 16384 32800 0 256 32768 16416 0 257 1032 8224 0 257 3084 8224 0 258 7182 4128 0 258 15375 4128 0 258 32767 36896 0 260 65535 51232 0 260 65535 51232 0 258 32767 36896 0 258 15375 4128 0 258 7182 4128 0 257 3084 8224 0 257 1032 8224 0 256 32768 16416 0 256 16384 32800 0 256 40961 16416 0 257 6150 8224 0 258 1848 4128 0 260 192 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  368.     offset: 0@0) shape: (Form
  369.     extent: 50@50
  370.     fromArray: #  (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  371.     offset: 0@0)!
  372.  
  373. initializeOffForms
  374.     "Initialize the default forms used to display in the off position."
  375.  
  376.     self initializeFourWayOffForm.
  377.     self initializeDiagonalOffForm.
  378.     self initializeHorizOffForm.
  379.     self initializeVertOffForm!
  380.  
  381. initializeOtherForms
  382.     "Initialize the other three displayable forms, by rotating
  383.      the existing 'up' form suitably."
  384.  
  385.     RightForm _ OpaqueForm
  386.                         figure: (UpForm figure rotateBy: 1)
  387.                         shape: (UpForm shape rotateBy: 1).
  388.     DownForm _ OpaqueForm
  389.                         figure: (UpForm figure rotateBy: 2)
  390.                         shape: (UpForm shape rotateBy: 2).
  391.     LeftForm _ OpaqueForm
  392.                         figure: (UpForm figure rotateBy: 3)
  393.                         shape: (UpForm shape rotateBy: 3).
  394.     DownRightForm _ OpaqueForm
  395.                         figure: (UpRightForm figure rotateBy: 1)
  396.                         shape: (UpRightForm shape rotateBy: 1).
  397.     DownLeftForm _ OpaqueForm
  398.                         figure: (UpRightForm figure rotateBy: 2)
  399.                         shape: (UpRightForm shape rotateBy: 2).
  400.     UpLeftForm _ OpaqueForm
  401.                         figure: (UpRightForm figure rotateBy: 3)
  402.                         shape: (UpRightForm shape rotateBy: 3).!
  403.  
  404. initializeUpForm
  405.     "Initialize the default form used to display in the up position."
  406.  
  407.     UpForm _ OpaqueForm figure: (Form
  408.     extent: 50@50
  409.     fromArray: #(0 192 0 0 0 1848 0 0 0 6150 0 0 0 8385 0 0 0 16864 32768 0 0 33776 16384 0 1 2040 8192 0 511 4092 16352 0 386 8190 4192 0 322 480 4256 0 290 480 4384 0 276 480 2592 0 268 480 3104 0 262 480 6176 0 258 480 4128 0 258 480 4128 0 257 0 8224 0 257 0 8224 0 256 32768 16416 0 256 16384 32800 0 256 8193 32 0 256 6150 32 0 256 7998 32 0 256 7374 32 0 256 7710 32 0 256 7710 32 0 256 7710 32 0 256 7998 32 0 256 7998 32 0 256 8190 32 0 256 8190 32 0 256 8193 32 0 256 16384 32800 0 256 32768 16416 0 257 0 8224 0 258 0 4128 0 260 0 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  410.     offset: 0@0) shape: (Form
  411.     extent: 50@50
  412.     fromArray: #(0 192 0 0 0 2040 0 0 0 8190 0 0 0 16383 0 0 0 32767 32768 0 0 65535 49152 0 1 65535 57344 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  413.     offset: 0@0)!
  414.  
  415. initializeUpRightForm
  416.     "Initialize the default form used to display in the up-and-right position."
  417.  
  418.     UpRightForm _ OpaqueForm figure: (Form
  419.     extent: 50@50
  420.     fromArray: # (0 0 1536 0 0 0 14784 0 0 0 49200 0 0 1 8 0 0 2 4 0 0 4 2 0 0 8 8177 0 511 65528 4081 0 384 16 2032 32768 320 16 1008 32768 288 16 2032 32768 272 32 4080 16384 264 32 8048 16384 260 16 15920 32768 258 16 31760 32768 257 16 30720 32768 256 32808 28673 0 256 16424 1 0 256 8260 2 0 256 8130 4 0 256 8065 8 0 256 8064 49200 0 256 7936 14816 0 256 7936 50720 0 256 7683 32 0 256 7694 32 0 256 7230 32 0 256 7422 32 0 256 8190 32 0 256 8190 32 0 256 8190 32 0 256 8193 32 0 256 16384 32800 0 256 32768 16416 0 257 0 8224 0 258 0 4128 0 260 0 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  421.     offset: 0@0) shape: (Form
  422.     extent: 50@50
  423.     fromArray: #  (0 0 1536 0 0 0 16320 0 0 0 65520 0 0 1 65528 0 0 3 65532 0 0 7 65534 0 0 15 65535 0 511 65535 65535 0 511 65535 65535 32768 511 65535 65535 32768 511 65535 65535 32768 511 65535 65535 49152 511 65535 65535 49152 511 65535 65535 32768 511 65535 65535 32768 511 65535 65535 32768 511 65535 65535 0 511 65535 65535 0 511 65535 65534 0 511 65535 65532 0 511 65535 65528 0 511 65535 65520 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  424.     offset: 0@0)!
  425.  
  426. initializeVertOffForm
  427.     "Initialize the default form used to display in the off position,
  428.      for 2-way vertical joysticks."
  429.  
  430.     VertOffForm _ OpaqueForm figure: (Form
  431.     extent: 50@50
  432.     fromArray: #  (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 384 0 96 0 320 0 160 0 288 0 288 0 272 0 544 0 264 0 1056 0 260 192 2080 0 258 1848 4128 0 257 6150 8224 0 256 41153 16416 0 256 16864 32800 0 256 33776 16416 0 257 2040 8224 0 257 4092 8224 0 258 8190 4128 0 258 480 4128 0 258 480 4128 0 260 480 2080 0 260 480 2080 0 258 480 4128 0 258 480 4128 0 258 8190 4128 0 257 4092 8224 0 257 2040 8224 0 256 33776 16416 0 256 16864 32800 0 256 41153 16416 0 257 6150 8224 0 258 1848 4128 0 260 192 2080 0 264 0 1056 0 272 0 544 0 288 0 288 0 320 0 160 0 384 0 96 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  433.     offset: 0@0) shape: (Form
  434.     extent: 50@50
  435.     fromArray: #(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 511 65535 65504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
  436.     offset: 0@0)! !
  437.  
  438. JoystickView initialize!
  439.  
  440.  
  441. Model subclass: #Joystick
  442.     instanceVariableNames: 'state '
  443.     classVariableNames: ''
  444.     poolDictionaries: ''
  445.     category: 'Interface-Joysticks'!
  446. Joystick comment:
  447. 'I represent an abstract superclass for various joysticks.  Instances of my
  448. subclasses are intended to be used with instances of JoystickView and
  449. JoystickController.
  450.  
  451. I have just one instance variable:
  452.  
  453. state    <Symbol> representing the current state of the receiver.
  454.  
  455. "GraphHolderView
  456.     openOn: (Array
  457.             with: Joystick
  458.             with: JoystickView
  459.             with: JoystickController)
  460.     label: ''Joysticks''
  461.     format: #( horizontal)
  462.     menu: (ActionMenu labels: ''browse\inspect'' withCRs selectors: #(browse inspect))."
  463. '!
  464.  
  465.  
  466. !Joystick methodsFor: 'initialize-release'!
  467.  
  468. initialize
  469.     "Initialize the receiver's state to #off.  Subclasses should include 
  470.      super initialize in any re-implementation."
  471.  
  472.     state _ #off! !
  473.  
  474. !Joystick methodsFor: 'dependents access'!
  475.  
  476. removeDependent: aDependent 
  477.     "If aDependent is the only dependent in the list, the receiver sends  
  478.     Joystick|release to try to break up possible pointer cycles."
  479.  
  480.     super removeDependent: aDependent.
  481.     self dependents isEmpty ifTrue: [self release]! !
  482.  
  483. !Joystick methodsFor: 'testing'!
  484.  
  485. isDown
  486.     "Answer whether the receiver is down."
  487.  
  488.     ^state == #down!
  489.  
  490. isDownLeft
  491.     "Answer whether the receiver is down-and-left."
  492.  
  493.     ^state == #leftDown!
  494.  
  495. isDownRight
  496.     "Answer whether the receiver is down-and-right."
  497.  
  498.     ^state == #rightDown!
  499.  
  500. isLeft
  501.     "Answer whether the receiver is left."
  502.  
  503.     ^state == #left!
  504.  
  505. isOff
  506.     "Answer whether the receiver is off."
  507.  
  508.     ^state == #off!
  509.  
  510. isOn
  511.     "Answer whether the receiver is on."
  512.  
  513.     ^(state ~~ #off)!
  514.  
  515. isRight
  516.     "Answer whether the receiver is right."
  517.  
  518.     ^state == #right!
  519.  
  520. isUp
  521.     "Answer whether the receiver is up."
  522.  
  523.     ^state == #up!
  524.  
  525. isUpLeft
  526.     "Answer whether the receiver is up-and-left."
  527.  
  528.     ^state == #leftUp!
  529.  
  530. isUpRight
  531.     "Answer whether the receiver is up-and-right."
  532.  
  533.     ^state == #rightUp! !
  534.  
  535. !Joystick methodsFor: 'state changes'!
  536.  
  537. clear
  538.     "Set the state of the receiver to 'off'.  If the state of the
  539.      receiver was not previously 'off', then 'self change' is sent.
  540.      No actions are executed."
  541.  
  542.     self isOn ifTrue: [state _ #off.  self changed]!
  543.  
  544. moveAngle: anAngle
  545.     "The angle between the joystick center and the cursor position is
  546.      anAngle, relative to the x-axis.  Move appropriately."
  547.  
  548.     self subclassResponsibility!
  549.  
  550. moveCharacter: aCharacter
  551.     "Execute the block selected by aCharacter (from the user).  The default
  552.      behaviour is to signal an error."
  553.  
  554.     self changed: #error!
  555.  
  556. movePoint: aPoint
  557.     "The distance between the joystick center and the cursor position is
  558.      given by aPoint.  Perform the appropriate state changes."
  559.  
  560.     self moveAngle: aPoint theta radiansToDegrees!
  561.  
  562. return
  563.     "Set the state of the receiver to #off and perform the appropriate
  564.      off action.  If the receiver was not previously off, update any dependents."
  565.  
  566.     self subclassResponsibility!
  567.  
  568. state
  569.     "Answer with the current state of the receiver."
  570.  
  571.     ^state! !
  572.  
  573. !Joystick methodsFor: 'action'!
  574.  
  575. doAction: aBlock 
  576.     "Execute aBlock if it is non-nil."
  577.  
  578.     aBlock notNil ifTrue: [aBlock value]! !
  579. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  580.  
  581. Joystick class
  582.     instanceVariableNames: ''!
  583.  
  584.  
  585. !Joystick class methodsFor: 'instance creation'!
  586.  
  587. new
  588.     "Answer an instance of me such that all actions are set to nil
  589.     ('no action'), and the state is set to #off."
  590.  
  591.     ^super new initialize! !
  592.  
  593. JoystickController subclass: #RepeatJoystickController
  594.     instanceVariableNames: ''
  595.     classVariableNames: ''
  596.     poolDictionaries: ''
  597.     category: 'Interface-Joysticks'!
  598. RepeatJoystickController comment:
  599. 'I am a subclass of JoystickController who knows how to repeatedly
  600. signal the model when the red button is pressed.'!
  601.  
  602.  
  603. !RepeatJoystickController methodsFor: 'control defaults'!
  604.  
  605. controlActivity
  606.     "If the red button is pressed, move the joystick about."
  607.  
  608.     sensor keyboardPressed ifTrue: [
  609.         model moveCharacter: sensor keyboard].
  610.     [sensor redButtonPressed] whileTrue: [self movementAction].
  611.     model return! !
  612.  
  613. Joystick subclass: #TwoWayVertJoystick
  614.     instanceVariableNames: 'upOnAction upOffAction downOnAction downOffAction upChar downChar '
  615.     classVariableNames: ''
  616.     poolDictionaries: ''
  617.     category: 'Interface-Joysticks'!
  618. TwoWayVertJoystick comment:
  619. 'I represent a Joystick which can move only up and down.  I have four
  620. instance variables, which are blocks which execute whenever the state
  621. changes:
  622.  
  623. onUpAction        <BlockContext> or nil
  624. offUpAction        <BlockContext> or nil
  625. onDownAction    <BlockContext> or nil
  626. offDownAction    <BlockContext> or nil
  627. upChar            <Character> for moving up
  628. downChar        <Character> for moving down'!
  629.  
  630.  
  631. !TwoWayVertJoystick methodsFor: 'initialize-release'!
  632.  
  633. release
  634.     "Set all the actions of the receiver to nil ('no action') in order to break 
  635.     possible pointer cycles.  It is sent by Joystick|removeDependent: when the 
  636.     last dependent has been deleted from the Joystick's list of dependents."
  637.  
  638.     super release.
  639.     upOnAction _ nil.
  640.     upOffAction _ nil.
  641.     downOnAction _ nil.
  642.     downOffAction _ nil.! !
  643.  
  644. !TwoWayVertJoystick methodsFor: 'accessing'!
  645.  
  646. downChar: aCharacter 
  647.     "Set the 'down' character to aCharacter."
  648.  
  649.     downChar _ aCharacter!
  650.  
  651. upChar: aCharacter 
  652.     "Set the 'up' character to aCharacter."
  653.  
  654.     upChar _ aCharacter! !
  655.  
  656. !TwoWayVertJoystick methodsFor: 'state changes'!
  657.  
  658. goDown
  659.     "Set the state of the receiver to #down and perform the `down on'
  660.      action.  If the receiver was not #down, then change any dependents."
  661.  
  662.     self doAction: downOnAction.
  663.     self isDown ifFalse: [state _ #down.  self changed]!
  664.  
  665. goToDown
  666.     "Return to the #off position, and then move to #down."
  667.  
  668.     self return.
  669.     self goDown.!
  670.  
  671. goToUp
  672.     "Return to the #off position, and then move to #up."
  673.  
  674.     self return.
  675.     self goUp.!
  676.  
  677. goUp
  678.     "Set the state of the receiver to #up and perform the `up on'
  679.      action.  If the receiver was not #up, then change any dependents."
  680.  
  681.     self doAction: upOnAction.
  682.     self isUp ifFalse: [state _ #up.  self changed]!
  683.  
  684. moveAngle: anAngle
  685.     "The angle between the joystick center and the cursor position is
  686.      anAngle, relative to the x-axis.  Move appropriately."
  687.  
  688.     (anAngle between: 45 and: 135)
  689.         ifTrue: [self isDown ifTrue: [^self goDown] ifFalse: [^self goToDown]].
  690.     (anAngle between: 225 and: 315)
  691.         ifTrue: [self isUp ifTrue: [^self goUp] ifFalse: [^self goToUp]]!
  692.  
  693. moveCharacter: aCharacter 
  694.     "Execute the block selected by aCharacter (from the user)."
  695.  
  696.     aCharacter == upChar ifTrue: [self goUp.  ^self return].
  697.     aCharacter == downChar ifTrue: [self goDown.  ^self return].
  698.     super moveCharacter: aCharacter!
  699.  
  700. return
  701.     "Set the state of the receiver to #off and perform the appropriate
  702.      off action.  If the receiver was not previously off, update any dependents."
  703.  
  704.     self isUp ifTrue: [self doAction: upOffAction].
  705.     self isDown ifTrue: [self doAction: downOffAction].
  706.     self isOff ifFalse: [state _ #off.  self changed]! !
  707.  
  708. !TwoWayVertJoystick methodsFor: 'action'!
  709.  
  710. downOffAction: aBlock
  711.     "Set the down, off action of the receiver to aBlock."
  712.  
  713.     downOffAction _ aBlock fixTemps!
  714.  
  715. downOnAction: aBlock
  716.     "Set the down, on action of the receiver to aBlock."
  717.  
  718.     downOnAction _ aBlock fixTemps!
  719.  
  720. upOffAction: aBlock
  721.     "Set the up, off action of the receiver to aBlock."
  722.  
  723.     upOffAction _ aBlock fixTemps!
  724.  
  725. upOnAction: aBlock
  726.     "Set the up, on action of the receiver to aBlock."
  727.  
  728.     upOnAction _ aBlock fixTemps! !
  729. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  730.  
  731. TwoWayVertJoystick class
  732.     instanceVariableNames: ''!
  733.  
  734.  
  735. !TwoWayVertJoystick class methodsFor: 'instance creation'!
  736.  
  737. upAction: upBlock downAction: downBlock 
  738.     "Answer with a new instance of the receiver, which evaluates  
  739.      upBlock when moved up, and downBlock when moved down."
  740.  
  741.     | temp |
  742.     temp _ super new upOnAction: upBlock.
  743.     temp downOnAction: downBlock.
  744.     ^temp! !
  745.  
  746. !TwoWayVertJoystick class methodsFor: 'examples'!
  747.  
  748. example1
  749.     "Illustrates basic action of a TwoWayVertJoystick."
  750.     "TwoWayVertJoystick example1."
  751.  
  752.     | j |
  753.     j _ TwoWayVertJoystick
  754.             upAction: [Transcript cr; show: 'Going up.']
  755.             downAction: [Transcript cr; show: 'Going down.'].
  756.     j goToUp.
  757.     j goToDown.
  758.     j return!
  759.  
  760. example2
  761.     "Illustrates use of TwoWayVertJoystick with simple view and normal
  762.      (non-auto-repeat) controller.  No 'off' actions."
  763.     "TwoWayVertJoystick example2."
  764.  
  765.     | view topView joystick |
  766.     joystick _ TwoWayVertJoystick
  767.                 upAction: [Transcript cr; show: 'Going up.']
  768.                 downAction: [Transcript cr; show: 'Going down.'].
  769.     view _ JoystickView new model: joystick.
  770.     topView _ StandardSystemView
  771.                 model: nil
  772.                 label: 'Vertical Joystick'
  773.                 minimumSize: 55 @ 55.
  774.     topView borderWidth: 2.
  775.     topView addSubView: view.
  776.     topView controller open!
  777.  
  778. example3
  779.     "This example uses an 'auto-repeat' controller."
  780.     "TwoWayVertJoystick example3."
  781.  
  782.     | view topView joystick |
  783.     joystick _ TwoWayVertJoystick
  784.                 upAction: [Transcript cr; show: 'Going up.']
  785.                 downAction: [Transcript cr; show: 'Going down.'].
  786.     view _ JoystickView new
  787.                 model: joystick
  788.                 controller: RepeatJoystickController new.
  789.     topView _ StandardSystemView
  790.                 model: nil
  791.                 label: 'Vertical Joystick'
  792.                 minimumSize: 55 @ 55.
  793.     topView borderWidth: 2.
  794.     topView addSubView: view.
  795.     topView controller open!
  796.  
  797. example4
  798.     "This example uses an 'auto-repeat' controller, 'off' actions, and
  799.      the view has a coloured background."
  800.     "TwoWayVertJoystick example4."
  801.  
  802.     | view topView joystick |
  803.     joystick _ TwoWayVertJoystick
  804.                 upAction: [Transcript cr; show: 'Going up...']
  805.                 downAction: [Transcript cr; show: 'Going down...'].
  806.     joystick upOffAction: [Transcript show: 'back to center'].
  807.     joystick downOffAction: [Transcript show: 'back to center'].
  808.     view _ JoystickView new
  809.                 model: joystick
  810.                 controller: RepeatJoystickController new.
  811.     view insideColor: Form veryLightGray.
  812.     topView _ StandardSystemView
  813.                 model: nil
  814.                 label: 'Vertical Joystick'
  815.                 minimumSize: 55 @ 55.
  816.     topView borderWidth: 2.
  817.     topView addSubView: view.
  818.     topView controller open!
  819.  
  820. example5
  821.     "Illustrates use of TwoWayVertJoystick with simple view and normal
  822.      (non-auto-repeat) controller.  Uses character input ('rogue'-style)."
  823.     "TwoWayVertJoystick example5."
  824.  
  825.     | view topView joystick |
  826.     joystick _ TwoWayVertJoystick
  827.                 upAction: [Transcript cr; show: 'Going up.']
  828.                 downAction: [Transcript cr; show: 'Going down.'].
  829.     joystick upChar: $k.
  830.     joystick downChar: $j.
  831.     view _ JoystickView new model: joystick.
  832.     topView _ StandardSystemView
  833.                 model: nil
  834.                 label: 'Vertical Joystick'
  835.                 minimumSize: 55 @ 55.
  836.     topView borderWidth: 2.
  837.     topView addSubView: view.
  838.     topView controller open! !
  839.  
  840. Joystick subclass: #ContinuousJoystick
  841.     instanceVariableNames: 'action '
  842.     classVariableNames: ''
  843.     poolDictionaries: ''
  844.     category: 'Interface-Joysticks'!
  845. ContinuousJoystick comment:
  846. 'I am a Joystick subclass which represents continuous movement in any
  847. direction.  I have a single instance variable:
  848.  
  849. action        <BlockContext>
  850.  
  851. The ''action'' Block should have one argument.  When the Joystick is
  852. moved, the action is performed with the argument being a point representing
  853. the displacement from the center of the Joystick.
  854. '!
  855.  
  856.  
  857. !ContinuousJoystick methodsFor: 'initialize-release'!
  858.  
  859. release
  860.     "Nil out the action block, to help break up any pointer cycles."
  861.  
  862.     super release.
  863.     action _ nil! !
  864.  
  865. !ContinuousJoystick methodsFor: 'testing'!
  866.  
  867. isDown
  868.     "Answer whether the receiver is down."
  869.  
  870.     ^state == #down!
  871.  
  872. isDownLeft
  873.     "Answer whether the receiver is down-and-left."
  874.  
  875.     ^state == #leftDown!
  876.  
  877. isDownRight
  878.     "Answer whether the receiver is down-and-right."
  879.  
  880.     ^state == #rightDown!
  881.  
  882. isLeft
  883.     "Answer whether the receiver is left."
  884.  
  885.     ^state == #left!
  886.  
  887. isRight
  888.     "Answer whether the receiver is right."
  889.  
  890.     ^state == #right!
  891.  
  892. isUp
  893.     "Answer whether the receiver is up."
  894.  
  895.     ^state == #up!
  896.  
  897. isUpLeft
  898.     "Answer whether the receiver is up-and-left."
  899.  
  900.     ^state == #leftUp!
  901.  
  902. isUpRight
  903.     "Answer whether the receiver is up-and-right."
  904.  
  905.     ^state == #rightUp! !
  906.  
  907. !ContinuousJoystick methodsFor: 'state changes'!
  908.  
  909. goDown
  910.     "Set the state to #down.  If not already in this state, then
  911.      signal a change."
  912.  
  913.     self isDown ifFalse: [
  914.         state _ #down.
  915.         self changed]!
  916.  
  917. goDownLeft
  918.     "Set the state to #leftDown.  If not already in this state, then
  919.      signal a change."
  920.  
  921.     self isDownLeft ifFalse: [
  922.         state _ #leftDown.
  923.         self changed]!
  924.  
  925. goDownRight
  926.     "Set the state to #rightDown.  If not already in this state, then
  927.      signal a change."
  928.  
  929.     self isDownRight ifFalse: [
  930.         state _ #rightDown.
  931.         self changed]!
  932.  
  933. goLeft
  934.     "Set the state to #left.  If not already in this state, then
  935.      signal a change."
  936.  
  937.     self isLeft ifFalse: [
  938.         state _ #left.
  939.         self changed]!
  940.  
  941. goRight
  942.     "Set the state to #right.  If not already in this state, then
  943.      signal a change."
  944.  
  945.     self isRight ifFalse: [
  946.         state _ #right.
  947.         self changed]!
  948.  
  949. goUp
  950.     "Set the state to #up.  If not already in this state, then
  951.      signal a change."
  952.  
  953.     self isUp ifFalse: [
  954.         state _ #up.
  955.         self changed]!
  956.  
  957. goUpLeft
  958.     "Set the state to #leftUp.  If not already in this state, then
  959.      signal a change."
  960.  
  961.     self isUpLeft ifFalse: [
  962.         state _ #leftUp.
  963.         self changed]!
  964.  
  965. goUpRight
  966.     "Set the state to #rightUp.  If not already in this state, then
  967.      signal a change."
  968.  
  969.     self isUpRight ifFalse: [
  970.         state _ #rightUp.
  971.         self changed]!
  972.  
  973. moveAngle: anAngle
  974.     "The angle between the joystick center and the cursor position is
  975.      anAngle, relative to the x-axis.  Move appropriately."
  976.  
  977.     (anAngle between: 23 and: 67) ifTrue: [^self goDownRight].
  978.     (anAngle between: 67 and: 112) ifTrue: [^self goDown].
  979.     (anAngle between: 112 and: 157) ifTrue: [^self goDownLeft].
  980.     (anAngle between: 157 and: 202) ifTrue: [^self goLeft].
  981.     (anAngle between: 202 and: 247) ifTrue: [^self goUpLeft].
  982.     (anAngle between: 247 and: 292) ifTrue: [^self goUp].
  983.     (anAngle between: 292 and: 337) ifTrue: [^self goUpRight].
  984.     self goRight!
  985.  
  986. movePoint: aPoint
  987.     "The argument aPoint represents the distance between the center to
  988.      the joystick and the current location.  Evaluate the 'action' block
  989.      with aPoint as its argument."
  990.  
  991.     super movePoint: aPoint.
  992.     action value: aPoint!
  993.  
  994. return
  995.     "Set the state of the receiver to #off and perform the appropriate
  996.      off action.  If the receiver was not previously off, update any dependents."
  997.  
  998.     self isOff ifFalse: [state _ #off.  self changed]! !
  999.  
  1000. !ContinuousJoystick methodsFor: 'action'!
  1001.  
  1002. setAction: aBlock
  1003.     "Set the action to be performed to aBlock, which should have
  1004.      one argument.  The block argument is a point representing the
  1005.      distance from the 'center' of the joystick."
  1006.  
  1007.     action _ aBlock! !
  1008. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1009.  
  1010. ContinuousJoystick class
  1011.     instanceVariableNames: ''!
  1012.  
  1013.  
  1014. !ContinuousJoystick class methodsFor: 'instance creation'!
  1015.  
  1016. action: aBlock
  1017.     "Answer with a new instance of the receiver, with action given
  1018.      by aBlock."
  1019.  
  1020.     ^self new setAction: aBlock! !
  1021.  
  1022. !ContinuousJoystick class methodsFor: 'examples'!
  1023.  
  1024. example1
  1025.     "Illustrates use of ContinuousJoystick with simple view and normal
  1026.      (non-auto-repeat) controller."
  1027.     "ContinuousJoystick example1."
  1028.  
  1029.     | view topView joystick |
  1030.     joystick _ ContinuousJoystick
  1031.                 action: [ :point | Transcript cr; show: point printString].
  1032.     view _ JoystickView new model: joystick.
  1033.     topView _ StandardSystemView
  1034.                 model: nil
  1035.                 label: 'Continuous Joystick'
  1036.                 minimumSize: 55 @ 55.
  1037.     topView borderWidth: 2.
  1038.     topView addSubView: view.
  1039.     topView controller open!
  1040.  
  1041. example2
  1042.     "Illustrates use of ContinuousJoystick with simple view and
  1043.      auto-repeat controller."
  1044.     "ContinuousJoystick example2."
  1045.  
  1046.     | view topView joystick |
  1047.     joystick _ ContinuousJoystick
  1048.                 action: [ :point | Transcript cr; show: point printString].
  1049.     view _ JoystickView new
  1050.                 model: joystick
  1051.                 controller: RepeatJoystickController new.
  1052.     topView _ StandardSystemView
  1053.                 model: nil
  1054.                 label: 'Continuous Joystick'
  1055.                 minimumSize: 55 @ 55.
  1056.     topView borderWidth: 2.
  1057.     topView addSubView: view.
  1058.     topView controller open!
  1059.  
  1060. example3
  1061.     "Illustrates use of ContinuousJoystick with view and auto-repeat
  1062.      controller.  Uses a very small 'dead region' size.  The view has a coloured
  1063.      background."
  1064.     "ContinuousJoystick example3."
  1065.  
  1066.     | view topView joystick |
  1067.     joystick _ ContinuousJoystick
  1068.                 action: [ :point | Transcript cr; show: point printString].
  1069.     view _ JoystickView new
  1070.                 model: joystick
  1071.                 controller: (RepeatJoystickController new offSize: 1).
  1072.     view insideColor: Form veryLightGray.
  1073.     topView _ StandardSystemView
  1074.                 model: nil
  1075.                 label: 'Continuous Joystick'
  1076.                 minimumSize: 55 @ 55.
  1077.     topView borderWidth: 2.
  1078.     topView addSubView: view.
  1079.     topView controller open! !
  1080.  
  1081. Joystick subclass: #TwoWayHorizJoystick
  1082.     instanceVariableNames: 'leftOnAction leftOffAction rightOnAction rightOffAction leftChar rightChar '
  1083.     classVariableNames: ''
  1084.     poolDictionaries: ''
  1085.     category: 'Interface-Joysticks'!
  1086. TwoWayHorizJoystick comment:
  1087. 'I represent a Joystick which can move only left and right.  I have four
  1088. instance variables, which are blocks which execute whenever the state
  1089. changes:
  1090.  
  1091. onRightAction    <BlockContext> or nil
  1092. offRightAction    <BlockContext> or nil
  1093. onLeftAction    <BlockContext> or nil
  1094. offLeftAction    <BlockContext> or nil
  1095. leftChar        <Character> for moving left
  1096. rightChar        <Character> for moving right'!
  1097.  
  1098.  
  1099. !TwoWayHorizJoystick methodsFor: 'initialize-release'!
  1100.  
  1101. release
  1102.     "Set all the actions of the receiver to nil ('no action') in order to break 
  1103.     possible pointer cycles.  It is sent by Joystick|removeDependent: when the 
  1104.     last dependent has been deleted from the Joystick's list of dependents."
  1105.  
  1106.     super release.
  1107.     leftOnAction _ nil.
  1108.     leftOffAction _ nil.
  1109.     rightOnAction _ nil.
  1110.     rightOffAction _ nil.! !
  1111.  
  1112. !TwoWayHorizJoystick methodsFor: 'accessing'!
  1113.  
  1114. leftChar: aCharacter
  1115.     "Set the 'left' character to aCharacter."
  1116.  
  1117.     leftChar _ aCharacter!
  1118.  
  1119. rightChar: aCharacter
  1120.     "Set the 'right' character to aCharacter."
  1121.  
  1122.     rightChar _ aCharacter! !
  1123.  
  1124. !TwoWayHorizJoystick methodsFor: 'state changes'!
  1125.  
  1126. goLeft
  1127.     "Set the state of the receiver to #left and perform the `left on'
  1128.      action.  If the receiver was not #left, then change any dependents."
  1129.  
  1130.     self doAction: leftOnAction.
  1131.     self isLeft ifFalse: [state _ #left.  self changed]!
  1132.  
  1133. goRight
  1134.     "Set the state of the receiver to #right and perform the `right on'
  1135.      action.  If the receiver was not #right, then change any dependents."
  1136.  
  1137.     self doAction: rightOnAction.
  1138.     self isRight ifFalse: [state _ #right.  self changed]!
  1139.  
  1140. goToLeft
  1141.     "Return to the #off position, and then move to #left."
  1142.  
  1143.     self return.
  1144.     self goLeft.!
  1145.  
  1146. goToRight
  1147.     "Return to the #off position, and then move to #right."
  1148.  
  1149.     self return.
  1150.     self goRight.!
  1151.  
  1152. moveAngle: anAngle
  1153.     "The angle between the joystick center and the cursor position is
  1154.      anAngle, relative to the x-axis.  Move appropriately."
  1155.  
  1156.     (anAngle between: 135 and: 225)
  1157.         ifTrue: [self isLeft ifTrue: [^self goLeft] ifFalse: [^self goToLeft]].
  1158.     ((anAngle between: 315 and: 360) or: [anAngle between: 0 and: 45])
  1159.         ifTrue: [self isRight ifTrue: [^self goRight] ifFalse: [^self goToRight]]!
  1160.  
  1161. moveCharacter: aCharacter 
  1162.     "Execute the block selected by aCharacter (from the user)."
  1163.  
  1164.     aCharacter == leftChar ifTrue: [self goLeft.  ^self return].
  1165.     aCharacter == rightChar ifTrue: [self goRight.  ^self return].
  1166.     super moveCharacter: aCharacter!
  1167.  
  1168. return
  1169.     "Set the state of the receiver to #off and perform the appropriate
  1170.      off action.  If the receiver was not previously off, update any dependents."
  1171.  
  1172.     self isRight ifTrue: [self doAction: rightOffAction].
  1173.     self isLeft ifTrue: [self doAction: leftOffAction].
  1174.     self isOff ifFalse: [state _ #off.  self changed]! !
  1175.  
  1176. !TwoWayHorizJoystick methodsFor: 'action'!
  1177.  
  1178. leftOffAction: aBlock
  1179.     "Set the left, off action of the receiver to aBlock."
  1180.  
  1181.     leftOffAction _ aBlock fixTemps!
  1182.  
  1183. leftOnAction: aBlock
  1184.     "Set the left, on action of the receiver to aBlock."
  1185.  
  1186.     leftOnAction _ aBlock fixTemps!
  1187.  
  1188. rightOffAction: aBlock
  1189.     "Set the right, off action of the receiver to aBlock."
  1190.  
  1191.     rightOffAction _ aBlock fixTemps!
  1192.  
  1193. rightOnAction: aBlock
  1194.     "Set the right, on action of the receiver to aBlock."
  1195.  
  1196.     rightOnAction _ aBlock fixTemps! !
  1197. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1198.  
  1199. TwoWayHorizJoystick class
  1200.     instanceVariableNames: ''!
  1201.  
  1202.  
  1203. !TwoWayHorizJoystick class methodsFor: 'instance creation'!
  1204.  
  1205. leftAction: leftBlock rightAction: rightBlock 
  1206.     "Answer with a new instance of the receiver, which evaluates 
  1207.      leftBlock  when moved left, and rightBlock when moved right."
  1208.  
  1209.     | temp |
  1210.     temp _ super new leftOnAction: leftBlock.
  1211.     temp rightOnAction: rightBlock.
  1212.     ^temp! !
  1213.  
  1214. !TwoWayHorizJoystick class methodsFor: 'examples'!
  1215.  
  1216. example1
  1217.     "Illustrates basic action of a TwoWayHorizJoystick."
  1218.     "TwoWayHorizJoystick example1."
  1219.  
  1220.     | j |
  1221.     j _ TwoWayHorizJoystick
  1222.             leftAction: [Transcript cr; show: 'Going left.']
  1223.             rightAction: [Transcript cr; show: 'Going right.'].
  1224.     j goToLeft.
  1225.     j goToRight.
  1226.     j return!
  1227.  
  1228. example2
  1229.     "Illustrates use of TwoWayHorizJoystick with simple view and normal
  1230.      (non-auto-repeat) controller.  No 'off' actions."
  1231.     "TwoWayHorizJoystick example2."
  1232.  
  1233.     | view topView joystick |
  1234.     joystick _ TwoWayHorizJoystick
  1235.                 leftAction: [Transcript cr; show: 'Going left.']
  1236.                 rightAction: [Transcript cr; show: 'Going right.'].
  1237.     view _ JoystickView new model: joystick.
  1238.     topView _ StandardSystemView
  1239.                 model: nil
  1240.                 label: 'Horizontal Joystick'
  1241.                 minimumSize: 55 @ 55.
  1242.     topView borderWidth: 2.
  1243.     topView addSubView: view.
  1244.     topView controller open!
  1245.  
  1246. example3
  1247.     "This example uses an 'auto-repeat' controller."
  1248.     "TwoWayHorizJoystick example3."
  1249.  
  1250.     | view topView joystick |
  1251.     joystick _ TwoWayHorizJoystick
  1252.                 leftAction: [Transcript cr; show: 'Going left.']
  1253.                 rightAction: [Transcript cr; show: 'Going right.'].
  1254.     view _ JoystickView new
  1255.                 model: joystick
  1256.                 controller: RepeatJoystickController new.
  1257.     topView _ StandardSystemView
  1258.                 model: nil
  1259.                 label: 'Horizontal Joystick'
  1260.                 minimumSize: 55 @ 55.
  1261.     topView borderWidth: 2.
  1262.     topView addSubView: view.
  1263.     topView controller open!
  1264.  
  1265. example4
  1266.     "This example uses an 'auto-repeat' controller, 'off' actions, and
  1267.      the view has a coloured background."
  1268.     "TwoWayHorizJoystick example4."
  1269.  
  1270.     | view topView joystick |
  1271.     joystick _ TwoWayHorizJoystick
  1272.                 leftAction: [Transcript cr; show: 'Going left...']
  1273.                 rightAction: [Transcript cr; show: 'Going right...'].
  1274.     joystick leftOffAction: [Transcript show: 'back to center'].
  1275.     joystick rightOffAction: [Transcript show: 'back to center'].
  1276.     view _ JoystickView new
  1277.                 model: joystick
  1278.                 controller: RepeatJoystickController new.
  1279.     view insideColor: Form veryLightGray.
  1280.     topView _ StandardSystemView
  1281.                 model: nil
  1282.                 label: 'Horizontal Joystick'
  1283.                 minimumSize: 55 @ 55.
  1284.     topView borderWidth: 2.
  1285.     topView addSubView: view.
  1286.     topView controller open!
  1287.  
  1288. example5
  1289.     "Illustrates use of TwoWayHorizJoystick with simple view and normal
  1290.      (non-auto-repeat) controller.  Uses character input ('rogue'-style)."
  1291.     "TwoWayHorizJoystick example5."
  1292.  
  1293.     | view topView joystick |
  1294.     joystick _ TwoWayHorizJoystick
  1295.                 leftAction: [Transcript cr; show: 'Going left.']
  1296.                 rightAction: [Transcript cr; show: 'Going right.'].
  1297.     joystick leftChar: $h.
  1298.     joystick rightChar: $l.
  1299.     view _ JoystickView new model: joystick.
  1300.     topView _ StandardSystemView
  1301.                 model: nil
  1302.                 label: 'Horizontal Joystick'
  1303.                 minimumSize: 55 @ 55.
  1304.     topView borderWidth: 2.
  1305.     topView addSubView: view.
  1306.     topView controller open! !
  1307.  
  1308. Joystick subclass: #DiagonalJoystick
  1309.     instanceVariableNames: 'upRightOnAction upRightOffAction upLeftOnAction upLeftOffAction downLeftOnAction downLeftOffAction downRightOnAction downRightOffAction upRightChar upLeftChar downLeftChar downRightChar '
  1310.     classVariableNames: ''
  1311.     poolDictionaries: ''
  1312.     category: 'Interface-Joysticks'!
  1313. DiagonalJoystick comment:
  1314. 'I am a Joystick subclass which represents movement in four diagonal directions.
  1315. My instance variables are:
  1316.  
  1317. upRightOnAction        <BlockContext> or nil
  1318. upRightOffAction        <BlockContext> or nil
  1319. upLeftOnAction            <BlockContext> or nil
  1320. upLeftOffAction        <BlockContext> or nil
  1321. downLeftOnAction        <BlockContext> or nil
  1322. downLeftOffAction        <BlockContext> or nil
  1323. downRightOnAction        <BlockContext> or nil
  1324. downRightOffAction    <BlockContext> or nil
  1325. upRightChar            <Character> for moving up-and-right
  1326. upLeftChar                <Character> for moving up-and-left
  1327. downRightChar            <Character> for moving down-and-right
  1328. downLeftChar            <Character> for moving down-and-left
  1329. '!
  1330.  
  1331.  
  1332. !DiagonalJoystick methodsFor: 'initialize-release'!
  1333.  
  1334. release
  1335.     "Set all the actions of the receiver to nil ('no action') in order to break 
  1336.     possible pointer cycles.  It is sent by Joystick|removeDependent: when the 
  1337.     last dependent has been deleted from the Joystick's list of dependents."
  1338.  
  1339.     super release.
  1340.     upLeftOnAction _ nil.
  1341.     upLeftOffAction _ nil.
  1342.     downLeftOnAction _ nil.
  1343.     downLeftOffAction _ nil.
  1344.     upRightOnAction _ nil.
  1345.     upRightOffAction _ nil.
  1346.     downRightOnAction _ nil.
  1347.     downRightOffAction _ nil.! !
  1348.  
  1349. !DiagonalJoystick methodsFor: 'accessing'!
  1350.  
  1351. downLeftChar: aCharacter 
  1352.     "Set the 'down-and-left' character to aCharacter."
  1353.  
  1354.     downLeftChar _ aCharacter!
  1355.  
  1356. downRightChar: aCharacter 
  1357.     "Set the 'down-and-right' character to aCharacter."
  1358.  
  1359.     downRightChar _ aCharacter!
  1360.  
  1361. upLeftChar: aCharacter 
  1362.     "Set the 'up-and-left' character to aCharacter."
  1363.  
  1364.     upLeftChar _ aCharacter!
  1365.  
  1366. upRightChar: aCharacter 
  1367.     "Set the 'up-and-right' character to aCharacter."
  1368.  
  1369.     upRightChar _ aCharacter! !
  1370.  
  1371. !DiagonalJoystick methodsFor: 'state changes'!
  1372.  
  1373. goDownLeft
  1374.     "Set the state of the receiver to #leftDown and perform the `down-and-left
  1375.      on' action.  If the receiver was not #leftDown, then change any dependents."
  1376.  
  1377.     self doAction: downLeftOnAction.
  1378.     self isDownLeft ifFalse: [state _ #leftDown.  self changed]!
  1379.  
  1380. goDownRight
  1381.     "Set the state of the receiver to #rightDown and perform the `down-and-right
  1382.      on' action.  If the receiver was not #rightDown, then change any dependents."
  1383.  
  1384.     self doAction: downRightOnAction.
  1385.     self isDownRight ifFalse: [state _ #rightDown.  self changed]!
  1386.  
  1387. goToDownLeft
  1388.     "Return to the #off position, and then move to down-and-left."
  1389.  
  1390.     self return.
  1391.     self goDownLeft.!
  1392.  
  1393. goToDownRight
  1394.     "Return to the #off position, and then move to down-and-right."
  1395.  
  1396.     self return.
  1397.     self goDownRight.!
  1398.  
  1399. goToUpLeft
  1400.     "Return to the #off position, and then move to up-and-left."
  1401.  
  1402.     self return.
  1403.     self goUpLeft.!
  1404.  
  1405. goToUpRight
  1406.     "Return to the #off position, and then move to up-and-right."
  1407.  
  1408.     self return.
  1409.     self goUpRight.!
  1410.  
  1411. goUpLeft
  1412.     "Set the state of the receiver to #leftUp and perform the `up-and-left
  1413.      on' action.  If the receiver was not #leftUp, then change any dependents."
  1414.  
  1415.     self doAction: upLeftOnAction.
  1416.     self isUpLeft ifFalse: [state _ #leftUp.  self changed]!
  1417.  
  1418. goUpRight
  1419.     "Set the state of the receiver to #rightUp and perform the `up-and-right
  1420.      on' action.  If the receiver was not #rightUp, then change any dependents."
  1421.  
  1422.     self doAction: upRightOnAction.
  1423.     self isUpRight ifFalse: [state _ #rightUp.  self changed]!
  1424.  
  1425. moveAngle: anAngle
  1426.     "The angle between the joystick center and the cursor position is
  1427.      anAngle, relative to the x-axis.  Move appropriately."
  1428.  
  1429.     (anAngle between: 0 and: 90)
  1430.         ifTrue: [self isDownRight ifTrue: [^self goDownRight] ifFalse: [^self goToDownRight]].
  1431.     (anAngle between: 90 and: 180)
  1432.         ifTrue: [self isDownLeft ifTrue: [^self goDownLeft] ifFalse: [^self goToDownLeft]].
  1433.     (anAngle between: 180 and: 270)
  1434.         ifTrue: [self isUpLeft ifTrue: [^self goUpLeft] ifFalse: [^self goToUpLeft]].
  1435.     self isUpRight ifTrue: [^self goUpRight] ifFalse: [^self goToUpRight]!
  1436.  
  1437. moveCharacter: aCharacter 
  1438.     "Execute the block selected by aCharacter (from the user)."
  1439.  
  1440.     aCharacter == upLeftChar ifTrue: [self goUpLeft.  ^self return].
  1441.     aCharacter == downLeftChar ifTrue: [self goDownLeft.  ^self return].
  1442.     aCharacter == upRightChar ifTrue: [self goUpRight.  ^self return].
  1443.     aCharacter == downRightChar ifTrue: [self goDownRight.  ^self return].
  1444.     super moveCharacter: aCharacter!
  1445.  
  1446. return
  1447.     "Set the state of the receiver to #off and perform the appropriate 
  1448.      off action.  If the receiver was not previously off, update any 
  1449.     dependents. "
  1450.  
  1451.     self isUpLeft ifTrue:  [self doAction: upLeftOffAction].
  1452.     self isUpRight ifTrue: [self doAction: upRightOffAction].
  1453.     self isDownLeft ifTrue: [self doAction: downLeftOffAction].
  1454.     self isDownRight ifTrue: [self doAction: downRightOffAction].
  1455.     self isOff ifFalse: [state _ #off.  self changed]! !
  1456.  
  1457. !DiagonalJoystick methodsFor: 'action'!
  1458.  
  1459. downLeftOffAction: aBlock
  1460.     "Set the down, left, off action of the receiver to aBlock."
  1461.  
  1462.     downLeftOffAction _ aBlock fixTemps!
  1463.  
  1464. downLeftOnAction: aBlock
  1465.     "Set the down, left, on action of the receiver to aBlock."
  1466.  
  1467.     downLeftOnAction _ aBlock fixTemps!
  1468.  
  1469. downRightOffAction: aBlock
  1470.     "Set the down, right, off action of the receiver to aBlock."
  1471.  
  1472.     downRightOffAction _ aBlock fixTemps!
  1473.  
  1474. downRightOnAction: aBlock
  1475.     "Set the down, right, on action of the receiver to aBlock."
  1476.  
  1477.     downRightOnAction _ aBlock fixTemps!
  1478.  
  1479. upLeftOffAction: aBlock
  1480.     "Set the up, left, off action of the receiver to aBlock."
  1481.  
  1482.     upLeftOffAction _ aBlock fixTemps!
  1483.  
  1484. upLeftOnAction: aBlock
  1485.     "Set the up, left, on action of the receiver to aBlock."
  1486.  
  1487.     upLeftOnAction _ aBlock fixTemps!
  1488.  
  1489. upRightOffAction: aBlock
  1490.     "Set the up, right, off action of the receiver to aBlock."
  1491.  
  1492.     upRightOffAction _ aBlock fixTemps!
  1493.  
  1494. upRightOnAction: aBlock
  1495.     "Set the up, right, on action of the receiver to aBlock."
  1496.  
  1497.     upRightOnAction _ aBlock fixTemps! !
  1498. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1499.  
  1500. DiagonalJoystick class
  1501.     instanceVariableNames: ''!
  1502.  
  1503.  
  1504. !DiagonalJoystick class methodsFor: 'instance creation'!
  1505.  
  1506. downLeftAction: downLeftBlock downRightAction: downRightBlock upLeftAction: upLeftBlock upRightAction: upRightBlock 
  1507.     "Answer with a new instance of the receiver, which evaluates 
  1508.      downLeftBlock when moved down-and-left, downRightBlock when 
  1509.      moved down-and-right, upLeftBlock when moved up-and-left and 
  1510.      upRightBlock when moved up-and-right."
  1511.  
  1512.     | temp |
  1513.     temp _ self new downLeftOnAction: downLeftBlock.
  1514.     temp downRightOnAction: downRightBlock.
  1515.     temp upRightOnAction: upRightBlock.
  1516.     temp upLeftOnAction: upLeftBlock.
  1517.     ^temp! !
  1518.  
  1519. !DiagonalJoystick class methodsFor: 'examples'!
  1520.  
  1521. example1
  1522.     "Illustrates basic action of a DiagonalJoystick."
  1523.     "DiagonalJoystick example1."
  1524.  
  1525.     | j |
  1526.     j _ DiagonalJoystick
  1527.             downLeftAction: [Transcript cr; show: 'Going left and down.']
  1528.             downRightAction: [Transcript cr; show: 'Going right and down']
  1529.             upLeftAction: [Transcript cr; show: 'Going left and up.']
  1530.             upRightAction: [Transcript cr; show: 'Going right and up.'].
  1531.     j goToDownLeft.
  1532.     j goToDownRight.
  1533.     j return.
  1534.     j goToUpLeft.
  1535.     j goToUpRight.
  1536.     j return!
  1537.  
  1538. example2
  1539.     "Illustrates use of DiagonalJoystick with simple view and 
  1540.      normal controller.  No 'off' actions."
  1541.     "DiagonalJoystick example2."
  1542.  
  1543.     | view topView joystick |
  1544.     joystick _ DiagonalJoystick
  1545.             downLeftAction: [Transcript cr; show: 'Going down-and-left.']
  1546.             downRightAction: [Transcript cr; show: 'Going down-and-right.']
  1547.             upLeftAction: [Transcript cr; show: 'Going up-and-left.']
  1548.             upRightAction: [Transcript cr; show: 'Going up-and-right.'].
  1549.     view _ JoystickView new model: joystick.
  1550.     topView _ StandardSystemView
  1551.                 model: nil
  1552.                 label: 'Diagonal Joystick'
  1553.                 minimumSize: 55 @ 55.
  1554.     topView borderWidth: 2.
  1555.     topView addSubView: view.
  1556.     topView controller open!
  1557.  
  1558. example3
  1559.     "Illustrates use of DiagonalJoystick with simple view and 
  1560.      auto-repeat controller.  No 'off' actions."
  1561.     "DiagonalJoystick example3."
  1562.  
  1563.     | view topView joystick |
  1564.     joystick _ DiagonalJoystick
  1565.             downLeftAction: [Transcript cr; show: 'Going down-and-left.']
  1566.             downRightAction: [Transcript cr; show: 'Going down-and-right.']
  1567.             upLeftAction: [Transcript cr; show: 'Going up-and-left.']
  1568.             upRightAction: [Transcript cr; show: 'Going up-and-right.'].
  1569.     view _ JoystickView new
  1570.         model: joystick
  1571.         controller: RepeatJoystickController new.
  1572.     topView _ StandardSystemView
  1573.                 model: nil
  1574.                 label: 'Diagonal Joystick'
  1575.                 minimumSize: 55 @ 55.
  1576.     topView borderWidth: 2.
  1577.     topView addSubView: view.
  1578.     topView controller open!
  1579.  
  1580. example4
  1581.     "This example uses an 'auto-repeat' controller, 'off' actions, and
  1582.      the view has a coloured background."
  1583.     "DiagonalJoystick example4."
  1584.  
  1585.     | view topView joystick |
  1586.     joystick _ DiagonalJoystick
  1587.             downLeftAction: [Transcript cr; show: 'Going down-and-left... ']
  1588.             downRightAction: [Transcript cr; show: 'Going down-and-right... ']
  1589.             upLeftAction: [Transcript cr; show: 'Going up-and-left... ']
  1590.             upRightAction: [Transcript cr; show: 'Going up-and-right... '].
  1591.     joystick downLeftOffAction: [Transcript show: 'back to center'].
  1592.     joystick downRightOffAction: [Transcript show: 'back to center'].
  1593.     joystick upLeftOffAction: [Transcript show: 'back to center'].
  1594.     joystick upRightOffAction: [Transcript show: 'back to center'].
  1595.     view _ JoystickView new
  1596.                 model: joystick
  1597.                 controller: RepeatJoystickController new.
  1598.     view insideColor: Form veryLightGray.
  1599.     topView _ StandardSystemView
  1600.                 model: nil
  1601.                 label: 'Diagonal Joystick'
  1602.                 minimumSize: 55 @ 55.
  1603.     topView borderWidth: 2.
  1604.     topView addSubView: view.
  1605.     topView controller open!
  1606.  
  1607. example5
  1608.     "Illustrates use of FourWayJoystick with simple view and normal
  1609.      (non-auto-repeat) controller.  Demonstrates 'rogue'-style key-bindings."
  1610.     "DiagonalJoystick example5."
  1611.  
  1612.     | view topView joystick |
  1613.     joystick _ DiagonalJoystick
  1614.             downLeftAction: [Transcript cr; show: 'Going down-and-left.']
  1615.             downRightAction: [Transcript cr; show: 'Going down-and-right.']
  1616.             upLeftAction: [Transcript cr; show: 'Going up-and-left.']
  1617.             upRightAction: [Transcript cr; show: 'Going up-and-right.'].
  1618.     joystick downLeftChar: $b.
  1619.     joystick downRightChar: $n.
  1620.     joystick upLeftChar: $y.
  1621.     joystick upRightChar: $u.
  1622.     view _ JoystickView new model: joystick.
  1623.     topView _ StandardSystemView
  1624.                 model: nil
  1625.                 label: 'Diagonal Joystick'
  1626.                 minimumSize: 55 @ 55.
  1627.     topView borderWidth: 2.
  1628.     topView addSubView: view.
  1629.     topView controller open! !
  1630.  
  1631. TwoWayHorizJoystick subclass: #FourWayJoystick
  1632.     instanceVariableNames: 'upOnAction upOffAction downOnAction downOffAction upChar downChar '
  1633.     classVariableNames: ''
  1634.     poolDictionaries: ''
  1635.     category: 'Interface-Joysticks'!
  1636. FourWayJoystick comment:
  1637. 'I am a Joystick subclass which represents movement in all four directions.
  1638. My instance variables are:
  1639.  
  1640. onUpAction        <BlockContext> or nil
  1641. offUpAction        <BlockContext> or nil
  1642. onDownAction    <BlockContext> or nil
  1643. offDownAction    <BlockContext> or nil
  1644. upChar            <Character> for moving up
  1645. downChar        <Character> for moving down
  1646.  
  1647. Ideally, I would be a subclass of both TwoWayHorizJoystick and
  1648. TwoWayVertJoystick, but this doesn''t work very well in Smalltalk.  I did
  1649. actually try this, but it was so slow that I re-arranged things to
  1650. the present structure.'!
  1651.  
  1652.  
  1653. !FourWayJoystick methodsFor: 'initialize-release'!
  1654.  
  1655. release
  1656.     "Set all the actions of the receiver to nil ('no action') in order to break 
  1657.     possible pointer cycles.  It is sent by Joystick|removeDependent: when the 
  1658.     last dependent has been deleted from the Joystick's list of dependents."
  1659.  
  1660.     super release.
  1661.     upOnAction _ nil.
  1662.     upOffAction _ nil.
  1663.     downOnAction _ nil.
  1664.     downOffAction _ nil.! !
  1665.  
  1666. !FourWayJoystick methodsFor: 'accessing'!
  1667.  
  1668. downChar: aCharacter 
  1669.     "Set the 'down' character to aCharacter."
  1670.  
  1671.     downChar _ aCharacter!
  1672.  
  1673. upChar: aCharacter 
  1674.     "Set the 'up' character to aCharacter."
  1675.  
  1676.     upChar _ aCharacter! !
  1677.  
  1678. !FourWayJoystick methodsFor: 'state changes'!
  1679.  
  1680. goDown
  1681.     "Set the state of the receiver to #down and perform the `down on'
  1682.      action.  If the receiver was not #down, then change any dependents."
  1683.  
  1684.     self doAction: downOnAction.
  1685.     self isDown ifFalse: [state _ #down.  self changed]!
  1686.  
  1687. goToDown
  1688.     "Return to the #off position, and then move to #down."
  1689.  
  1690.     self return.
  1691.     self goDown.!
  1692.  
  1693. goToUp
  1694.     "Return to the #off position, and then move to #up."
  1695.  
  1696.     self return.
  1697.     self goUp.!
  1698.  
  1699. goUp
  1700.     "Set the state of the receiver to #up and perform the `up on'
  1701.      action.  If the receiver was not #up, then change any dependents."
  1702.  
  1703.     self doAction: upOnAction.
  1704.     self isUp ifFalse: [state _ #up.  self changed]!
  1705.  
  1706. moveAngle: anAngle
  1707.     "The angle between the joystick center and the cursor position is
  1708.      anAngle, relative to the x-axis.  Move appropriately."
  1709.  
  1710.     (anAngle between: 45 and: 135)
  1711.         ifTrue: [self isDown ifTrue: [^self goDown] ifFalse: [^self goToDown]].
  1712.     (anAngle between: 135 and: 225)
  1713.         ifTrue: [self isLeft ifTrue: [^self goLeft] ifFalse: [^self goToLeft]].
  1714.     (anAngle between: 225 and: 315)
  1715.         ifTrue: [self isUp ifTrue: [^self goUp] ifFalse: [^self goToUp]].
  1716.     self isRight ifTrue: [^self goRight] ifFalse: [^self goToRight]!
  1717.  
  1718. moveCharacter: aCharacter 
  1719.     "Execute the block selected by aCharacter (from the user)."
  1720.  
  1721.     aCharacter == upChar ifTrue: [self goUp.  ^self return].
  1722.     aCharacter == downChar ifTrue: [self goDown.  ^self return].
  1723.     super moveCharacter: aCharacter!
  1724.  
  1725. return
  1726.     "Set the state of the receiver to #off and perform the appropriate
  1727.      off action.  If the receiver was not previously off, update any dependents."
  1728.  
  1729.     self isUp ifTrue: [self doAction: upOffAction].
  1730.     self isDown ifTrue: [self doAction: downOffAction].
  1731.     super return! !
  1732.  
  1733. !FourWayJoystick methodsFor: 'action'!
  1734.  
  1735. downOffAction: aBlock
  1736.     "Set the down, off action of the receiver to aBlock."
  1737.  
  1738.     downOffAction _ aBlock fixTemps!
  1739.  
  1740. downOnAction: aBlock
  1741.     "Set the down, on action of the receiver to aBlock."
  1742.  
  1743.     downOnAction _ aBlock fixTemps!
  1744.  
  1745. upOffAction: aBlock
  1746.     "Set the up, off action of the receiver to aBlock."
  1747.  
  1748.     upOffAction _ aBlock fixTemps!
  1749.  
  1750. upOnAction: aBlock
  1751.     "Set the up, on action of the receiver to aBlock."
  1752.  
  1753.     upOnAction _ aBlock fixTemps! !
  1754. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1755.  
  1756. FourWayJoystick class
  1757.     instanceVariableNames: ''!
  1758.  
  1759.  
  1760. !FourWayJoystick class methodsFor: 'instance creation'!
  1761.  
  1762. leftAction: leftBlock rightAction: rightBlock upAction: upBlock downAction: downBlock 
  1763.     "Answer with a new instance of the receiver, which evaluates  
  1764.      leftBlock when moved left, rightBlock when moved right, upBlock 
  1765.      when moved up and downBlock when moved down."
  1766.  
  1767.     | temp |
  1768.     temp _ self leftAction: leftBlock rightAction: rightBlock.
  1769.     temp upOnAction: upBlock.
  1770.     temp downOnAction: downBlock.
  1771.     ^temp! !
  1772.  
  1773. !FourWayJoystick class methodsFor: 'examples'!
  1774.  
  1775. example1
  1776.     "Illustrates basic action of a FourWayJoystick."
  1777.     "FourWayJoystick example1."
  1778.  
  1779.     | j |
  1780.     j _ FourWayJoystick
  1781.             leftAction: [Transcript cr; show: 'Going left.']
  1782.             rightAction: [Transcript cr; show: 'Going right.']
  1783.             upAction: [Transcript cr; show: 'Going up.']
  1784.             downAction: [Transcript cr; show: 'Going down.'].
  1785.     j goToLeft.
  1786.     j goToRight.
  1787.     j return.
  1788.     j goToUp.
  1789.     j goToDown.
  1790.     j return!
  1791.  
  1792. example2
  1793.     "Illustrates use of FourWayJoystick with simple view and normal
  1794.      (non-auto-repeat) controller.  No 'off' actions."
  1795.     "FourWayJoystick example2."
  1796.  
  1797.     | view topView joystick |
  1798.     joystick _ FourWayJoystick
  1799.             leftAction: [Transcript cr; show: 'Going left.']
  1800.             rightAction: [Transcript cr; show: 'Going right.']
  1801.             upAction: [Transcript cr; show: 'Going up.']
  1802.             downAction: [Transcript cr; show: 'Going down.'].
  1803.     view _ JoystickView new model: joystick.
  1804.     topView _ StandardSystemView
  1805.                 model: nil
  1806.                 label: 'Four-Way Joystick'
  1807.                 minimumSize: 55 @ 55.
  1808.     topView borderWidth: 2.
  1809.     topView addSubView: view.
  1810.     topView controller open!
  1811.  
  1812. example3
  1813.     "This example uses an 'auto-repeat' controller."
  1814.     "FourWayJoystick example3."
  1815.  
  1816.     | view topView joystick |
  1817.     joystick _ FourWayJoystick
  1818.             leftAction: [Transcript cr; show: 'Going left.']
  1819.             rightAction: [Transcript cr; show: 'Going right.']
  1820.             upAction: [Transcript cr; show: 'Going up.']
  1821.             downAction: [Transcript cr; show: 'Going down.'].
  1822.     view _ JoystickView new
  1823.                 model: joystick
  1824.                 controller: RepeatJoystickController new.
  1825.     topView _ StandardSystemView
  1826.                 model: nil
  1827.                 label: 'Four-way Joystick'
  1828.                 minimumSize: 55 @ 55.
  1829.     topView borderWidth: 2.
  1830.     topView addSubView: view.
  1831.     topView controller open!
  1832.  
  1833. example4
  1834.     "This example uses an 'auto-repeat' controller, 'off' actions, and
  1835.      the view has a coloured background."
  1836.     "FourWayJoystick example4."
  1837.  
  1838.     | view topView joystick |
  1839.     joystick _ FourWayJoystick
  1840.                 leftAction: [Transcript cr; show: 'Going left...']
  1841.                 rightAction: [Transcript cr; show: 'Going right...']
  1842.                 upAction: [Transcript cr; show: 'Going up...']
  1843.                 downAction: [Transcript cr; show: 'Going down...'].
  1844.     joystick leftOffAction: [Transcript show: 'back to center'].
  1845.     joystick rightOffAction: [Transcript show: 'back to center'].
  1846.     joystick upOffAction: [Transcript show: 'back to center'].
  1847.     joystick downOffAction: [Transcript show: 'back to center'].
  1848.     view _ JoystickView new
  1849.                 model: joystick
  1850.                 controller: RepeatJoystickController new.
  1851.     view insideColor: Form veryLightGray.
  1852.     topView _ StandardSystemView
  1853.                 model: nil
  1854.                 label: 'Four-way Joystick'
  1855.                 minimumSize: 55 @ 55.
  1856.     topView borderWidth: 2.
  1857.     topView addSubView: view.
  1858.     topView controller open!
  1859.  
  1860. example5
  1861.     "Illustrates use of FourWayJoystick with simple view and normal
  1862.      (non-auto-repeat) controller.  Demonstrates 'rogue'-style key-bindings."
  1863.     "FourWayJoystick example5."
  1864.  
  1865.     | view topView joystick |
  1866.     joystick _ FourWayJoystick
  1867.             leftAction: [Transcript cr; show: 'Going left.']
  1868.             rightAction: [Transcript cr; show: 'Going right.']
  1869.             upAction: [Transcript cr; show: 'Going up.']
  1870.             downAction: [Transcript cr; show: 'Going down.'].
  1871.     joystick upChar: $k.
  1872.     joystick downChar: $j.
  1873.     joystick leftChar: $h.
  1874.     joystick rightChar: $l.
  1875.     view _ JoystickView new model: joystick.
  1876.     topView _ StandardSystemView
  1877.                 model: nil
  1878.                 label: 'Four-Way Joystick'
  1879.                 minimumSize: 55 @ 55.
  1880.     topView borderWidth: 2.
  1881.     topView addSubView: view.
  1882.     topView controller open! !
  1883.  
  1884. FourWayJoystick subclass: #EightWayJoystick
  1885.     instanceVariableNames: 'upLeftChar upRightChar downLeftChar downRightChar '
  1886.     classVariableNames: ''
  1887.     poolDictionaries: ''
  1888.     category: 'Interface-Joysticks'!
  1889. EightWayJoystick comment:
  1890. 'I am a Joystick subclass which understands movement in eight directions.
  1891. In fact, I execute (for example) both the ''up'' and ''left'' blocks (defined
  1892. in my superclases) when I am positioned ''up-and-left''.  My instance
  1893. variables are:
  1894.  
  1895. upLeftChar        <Character> for moving up-and-left
  1896. upRightChar    <Character> for moving up-and-right
  1897. downLeftChar    <Character> for moving down-and-left
  1898. downRightChar    <Character> for moving down-and-right
  1899. '!
  1900.  
  1901.  
  1902. !EightWayJoystick methodsFor: 'accessing'!
  1903.  
  1904. downLeftChar: aCharacter 
  1905.     "Set the 'down-and-left' character to aCharacter."
  1906.  
  1907.     downLeftChar _ aCharacter!
  1908.  
  1909. downRightChar: aCharacter 
  1910.     "Set the 'down-and-right' character to aCharacter."
  1911.  
  1912.     downRightChar _ aCharacter!
  1913.  
  1914. upLeftChar: aCharacter 
  1915.     "Set the 'up-and-left' character to aCharacter."
  1916.  
  1917.     upLeftChar _ aCharacter!
  1918.  
  1919. upRightChar: aCharacter 
  1920.     "Set the 'up-and-right' character to aCharacter."
  1921.  
  1922.     upRightChar _ aCharacter! !
  1923.  
  1924. !EightWayJoystick methodsFor: 'state changes'!
  1925.  
  1926. goDownLeft
  1927.     "Set the state of the receiver to #leftDown and perform the `down-and-left on'
  1928.      action.  If the receiver was not #leftDown, then change any dependents."
  1929.  
  1930.     self doAction: leftOnAction.
  1931.     self doAction: downOnAction.
  1932.     self isDownLeft ifFalse: [state _ #leftDown.  self changed]!
  1933.  
  1934. goDownRight
  1935.     "Set the state of the receiver to #rightDown and perform the 
  1936.      `down-and-right on' action.  If the receiver was not #rightDown,
  1937.      then change any dependents. "
  1938.  
  1939.     self doAction: rightOnAction.
  1940.     self doAction: downOnAction.
  1941.     self isDownRight ifFalse: [state _ #rightDown.  self changed]!
  1942.  
  1943. goToDownLeft
  1944.     "Return to the #off position, and then move to down-and-left."
  1945.  
  1946.     self return.
  1947.     self goDownLeft.!
  1948.  
  1949. goToDownRight
  1950.     "Return to the #off position, and then move to down-and-right."
  1951.  
  1952.     self return.
  1953.     self goDownRight.!
  1954.  
  1955. goToUpLeft
  1956.     "Return to the #off position, and then move to up-and-left."
  1957.  
  1958.     self return.
  1959.     self goUpLeft.!
  1960.  
  1961. goToUpRight
  1962.     "Return to the #off position, and then move to up-and-right."
  1963.  
  1964.     self return.
  1965.     self goUpRight.!
  1966.  
  1967. goUpLeft
  1968.     "Set the state of the receiver to #leftUp and perform the `up-and-left on'
  1969.      action.  If the receiver was not #leftUp, then change any dependents."
  1970.  
  1971.     self doAction: leftOnAction.
  1972.     self doAction: upOnAction.
  1973.     self isUpLeft ifFalse: [state _ #leftUp.  self changed]!
  1974.  
  1975. goUpRight
  1976.     "Set the state of the receiver to #rightUp and perform the `up-and-right on'
  1977.      action.  If the receiver was not #rightUp, then change any dependents."
  1978.  
  1979.     self doAction: rightOnAction.
  1980.     self doAction: upOnAction.
  1981.     self isUpRight ifFalse: [state _ #rightUp.  self changed]!
  1982.  
  1983. moveAngle: anAngle
  1984.     "The angle between the joystick center and the cursor position is
  1985.      anAngle, relative to the x-axis.  Move appropriately."
  1986.  
  1987.     (anAngle between: 23 and: 67) ifTrue: [
  1988.         self isDownRight ifTrue: [^self goDownRight] ifFalse: [^self goToDownRight]].
  1989.     (anAngle between: 67 and: 112) ifTrue: [
  1990.         self isDown ifTrue: [^self goDown] ifFalse: [^self goToDown]].
  1991.     (anAngle between: 112 and: 157) ifTrue: [
  1992.         self isDownLeft ifTrue: [^self goDownLeft] ifFalse: [^self goToDownLeft]].
  1993.     (anAngle between: 157 and: 202) ifTrue: [
  1994.         self isLeft ifTrue: [^self goLeft] ifFalse: [^self goToLeft]].
  1995.     (anAngle between: 202 and: 247) ifTrue: [
  1996.         self isUpLeft ifTrue: [^self goUpLeft] ifFalse: [^self goToUpLeft]].
  1997.     (anAngle between: 247 and: 292) ifTrue: [
  1998.         self isUp ifTrue: [^self goUp] ifFalse: [^self goToUp]].
  1999.     (anAngle between: 292 and: 337) ifTrue: [
  2000.         self isUpRight ifTrue: [^self goUpRight] ifFalse: [^self goToUpRight]].
  2001.     self isRight ifTrue: [^self goRight] ifFalse: [^self goToRight]!
  2002.  
  2003. moveCharacter: aCharacter 
  2004.     "Execute the block selected by aCharacter (from the user)."
  2005.  
  2006.     aCharacter == upLeftChar ifTrue: [self goUpLeft.  ^self return].
  2007.     aCharacter == downLeftChar ifTrue: [self goDownLeft.  ^self return].
  2008.     aCharacter == upRightChar ifTrue: [self goUpRight.  ^self return].
  2009.     aCharacter == downRightChar ifTrue: [self goDownRight.  ^self return].
  2010.     super moveCharacter: aCharacter!
  2011.  
  2012. return
  2013.     "Set the state of the receiver to #off and perform the appropriate 
  2014.      off action.  If the receiver was not previously off, update any 
  2015.     dependents. "
  2016.  
  2017.     self isUpLeft ifTrue:  [
  2018.             self doAction: upOffAction.
  2019.             self doAction: leftOffAction].
  2020.     self isUpRight ifTrue: [
  2021.             self doAction: upOffAction.
  2022.             self doAction: rightOffAction].
  2023.     self isDownLeft ifTrue: [
  2024.             self doAction: downOffAction.
  2025.             self doAction: leftOffAction].
  2026.     self isDownRight ifTrue: [
  2027.             self doAction: downOffAction.
  2028.             self doAction: rightOffAction].
  2029.     super return! !
  2030. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2031.  
  2032. EightWayJoystick class
  2033.     instanceVariableNames: ''!
  2034.  
  2035.  
  2036. !EightWayJoystick class methodsFor: 'examples'!
  2037.  
  2038. example1
  2039.     "Illustrates basic action of an EightWayJoystick."
  2040.     "EightWayJoystick example1."
  2041.  
  2042.     | j |
  2043.     j _ EightWayJoystick
  2044.                 leftAction: [Transcript cr; show: 'Going left.']
  2045.                 rightAction: [Transcript cr; show: 'Going right.']
  2046.                 upAction: [Transcript cr; show: 'Going up.']
  2047.                 downAction: [Transcript cr; show: 'Going down.'].
  2048.     j goToUpRight.
  2049.     j return.
  2050.     j goToDownLeft.
  2051.     j return.
  2052.     j goToDown!
  2053.  
  2054. example2
  2055.     "Illustrates use of EightWayJoystick with simple view and normal
  2056.      (non-auto-repeat) controller.  No 'off' actions."
  2057.     "EightWayJoystick example2."
  2058.  
  2059.     | view topView joystick |
  2060.     joystick _ EightWayJoystick
  2061.                 leftAction: [Transcript cr; show: 'Going left.']
  2062.                 rightAction: [Transcript cr; show: 'Going right.']
  2063.                 upAction: [Transcript cr; show: 'Going up.']
  2064.                 downAction: [Transcript cr; show: 'Going down.'].
  2065.     view _ JoystickView new model: joystick.
  2066.     topView _ StandardSystemView
  2067.                 model: nil
  2068.                 label: 'Eight-way Joystick'
  2069.                 minimumSize: 55 @ 55.
  2070.     topView borderWidth: 2.
  2071.     topView addSubView: view.
  2072.     topView controller open!
  2073.  
  2074. example3
  2075.     "This example uses an 'auto-repeat' controller."
  2076.     "EightWayJoystick example3."
  2077.  
  2078.     | view topView joystick |
  2079.     joystick _ EightWayJoystick
  2080.                 leftAction: [Transcript cr; show: 'Going left.']
  2081.                 rightAction: [Transcript cr; show: 'Going right.']
  2082.                 upAction: [Transcript cr; show: 'Going up.']
  2083.                 downAction: [Transcript cr; show: 'Going down.'].
  2084.     view _ JoystickView new
  2085.                 model: joystick
  2086.                 controller: RepeatJoystickController new.
  2087.     topView _ StandardSystemView
  2088.                 model: nil
  2089.                 label: 'Eight-way Joystick'
  2090.                 minimumSize: 55 @ 55.
  2091.     topView borderWidth: 2.
  2092.     topView addSubView: view.
  2093.     topView controller open!
  2094.  
  2095. example4
  2096.     "This example uses an 'auto-repeat' controller, 'off' actions, and
  2097.      the view has a coloured background."
  2098.     "EightWayJoystick example4."
  2099.  
  2100.     | view topView joystick |
  2101.     joystick _ EightWayJoystick
  2102.                 leftAction: [Transcript cr; show: 'Going left...']
  2103.                 rightAction: [Transcript cr; show: 'Going right...']
  2104.                 upAction: [Transcript cr; show: 'Going up...']
  2105.                 downAction: [Transcript cr; show: 'Going down...'].
  2106.     joystick leftOffAction: [Transcript show: 'back to center '].
  2107.     joystick rightOffAction: [Transcript show: 'back to center '].
  2108.     joystick upOffAction: [Transcript show: 'back to center '].
  2109.     joystick downOffAction: [Transcript show: 'back to center '].
  2110.     view _ JoystickView new
  2111.                 model: joystick
  2112.                 controller: RepeatJoystickController new.
  2113.     view insideColor: Form veryLightGray.
  2114.     topView _ StandardSystemView
  2115.                 model: nil
  2116.                 label: 'Eight-way Joystick'
  2117.                 minimumSize: 55 @ 55.
  2118.     topView borderWidth: 2.
  2119.     topView addSubView: view.
  2120.     topView controller open!
  2121.  
  2122. example5
  2123.     "Illustrates use of EightWayJoystick with simple view and normal
  2124.      (non-auto-repeat) controller.  Uses 'rogue'-style key-bindings."
  2125.     "EightWayJoystick example5."
  2126.  
  2127.     | view topView joystick |
  2128.     joystick _ EightWayJoystick
  2129.                 leftAction: [Transcript cr; show: 'Going left.']
  2130.                 rightAction: [Transcript cr; show: 'Going right.']
  2131.                 upAction: [Transcript cr; show: 'Going up.']
  2132.                 downAction: [Transcript cr; show: 'Going down.'].
  2133.     joystick leftChar: $h.
  2134.     joystick upLeftChar: $y.
  2135.     joystick upChar: $k.
  2136.     joystick upRightChar: $u.
  2137.     joystick rightChar: $l.
  2138.     joystick downRightChar: $n.
  2139.     joystick downChar: $j.
  2140.     joystick downLeftChar: $b.
  2141.     view _ JoystickView new model: joystick.
  2142.     topView _ StandardSystemView
  2143.                 model: nil
  2144.                 label: 'Eight-way Joystick'
  2145.                 minimumSize: 55 @ 55.
  2146.     topView borderWidth: 2.
  2147.     topView addSubView: view.
  2148.     topView controller open! !    topView controller open! !
  2149.